21086
13467
comp.lang.c ++. moderated에서 C ++ / STL의 숨겨진 기능과 다크 코너를 읽은 후 다음 코드 조각이 Visual Studio 2008과 G ++ 4.4에서 컴파일되고 작동한다는 사실에 완전히 놀랐습니다.
코드는 다음과 같습니다.
#include 
int main ()
{
int x = 10;
while (x-> 0) // x는 0이됩니다.
{
printf ( "% d", x);
}
}
산출:
9876 5 4 3 2 1 0
GCC에서도 작동하기 때문에 이것이 C라고 가정합니다. 이것이 표준에서 정의 된 위치와 출처는 어디입니까? 
->은 연산자가 아닙니다. 실제로 두 개의 개별 연산자-및>입니다.
조건부 코드는 x를 감소시키고 x의 원래 (감소되지 않은) 값을 반환 한 다음> 연산자를 사용하여 원래 값을 0과 비교합니다.
더 잘 이해하기 위해 다음과 같이 성명을 작성할 수 있습니다.
while ((x--)> 0)
|
또는 완전히 다른 것을 위해 ... x는 0으로 미끄러집니다.
동안 (x-\
\
\
\
> 0)
printf ( "% d", x);
그다지 수학적이지는 않지만 ... 모든 그림은 천 단어를 그린다 ...
|
이것은 매우 복잡한 연산자이므로 ISO / IEC JTC1 (공동 기술위원회 1)조차도 C ++ 표준의 두 부분에 설명을 배치했습니다.
농담을 제외하고는 두 개의 다른 연산자입니다.-및>는 각각 C ++ 03 표준의 §5.2.6 / 2 및 §5.9에 설명되어 있습니다.
|
다음과 같습니다.
동안 (x--> 0)
x-(사후 감소)는 x = x-1과 동일하므로 코드는 다음과 같이 변환됩니다.
while (x> 0) {
x = x-1;
// 논리
}
엑스--; // x <= 0 일 때 수행되는 포스트 감소
|
x는 반대 방향으로 더 빨리 0으로 갈 수 있습니다.
int x = 10;
동안 (0 <---- x)
{
printf ( "% d", x);
}
8 6 4 2
화살표로 속도를 제어 할 수 있습니다!
int x = 100;
while (0 <-------------------- x)
{
printf ( "% d", x);
}
90 80 70 60 50 40 30 20 10
;)
|
이것의
#include 
int main (void) {
int x = 10;
while (x--> 0) {// x는 0이됩니다.
printf ( "% d", x);
}
반환 0;
}
공간 만 있으면 상황이 재미있어 보입니다. 감소하고 비교합니다.
|
->의 사용법은 역사적 관련성이 있습니다. 감소는 x86 아키텍처에서 증가하는 것보다 빠릅니다. ->를 사용하면 x가 0이되고 수학적 배경을 가진 사람들에게 호소력이 있습니다.
|
동안 (x--> 0)
그것이 파싱되는 방법입니다.
|
정말 괴짜이지만 이것을 사용할 것입니다.
#define as; while
int main (int argc, char * argv [])
{
int n = atoi (argv [1]);
do printf ( "n is % d \ n", n) as (n-> 0);
반환 0;
}
|
내가 읽은 한 책 (어떤 책이 정확히 기억이 나지 않습니다)은 다음과 같이 말했습니다. 컴파일러는 왼쪽 오른쪽 규칙을 사용하여 표현식을 가장 큰 토큰으로 구문 분석하려고합니다.
이 경우 표현식 :
x-> 0
가장 큰 토큰으로 구문 분석 :
토큰 1 : x
토큰 2 :-
토큰 3 :>
토큰 4 : 0
결론 : x--> 0
이 표현식에도 동일한 규칙이 적용됩니다.
a ----- b
구문 분석 후 :
토큰 1 : a
토큰 2 :-
토큰 3 :-
토큰 4 :-
토큰 5 : b
결론 : (a-)--b
복잡한 표현을 이해하는데 도움이 되었으면 좋겠습니다 ^^
|
이것은 정확히 동일합니다
동안 (x--)
{
printf ( "% d", x);
}
음수가 아닌 수
|
어쨌든, 이제 "goes to"연산자가 있습니다. "->"는 방향으로 기억하기 쉽고 "x가 0이되는 동안"은 곧바로 의미합니다.
또한 일부 플랫폼에서는 "for (x = 10; x> 0; x-)"보다 약간 더 효율적입니다.
|
이 코드는 먼저 x와 0을 비교 한 다음 x를 감소시킵니다. (또한 첫 번째 답변에서 말했습니다. x를 사후 감소한 다음 x와 0을> 연산자로 비교합니다.)이 코드의 출력을 참조하십시오.
9876 5 4 3 2 1 0
이제 먼저 비교 한 다음 출력에서 ​​0을 확인하여 감소합니다.
먼저 감소한 다음 비교하려면 다음 코드를 사용하십시오.
#include 
int main (void)
{
int x = 10;
while (--x> 0) // x는 0이됩니다.
{
printf ( "% d", x);
}
반환 0;
}
출력은 다음과 같습니다.
9876 5 4 3 2 1
|
이 코드를 실행하면 컴파일러에서 9876543210을 출력합니다.
#include 
int main ()
{
int x = 10;
while (x-> 0) // x는 0이됩니다.
{
std :: cout << x;
}
}
예상대로. while (x--> 0)은 실제로 while (x> 0)을 의미합니다. x-- 포스트는 x를 감소시킵니다.
동안 (x> 0)
{
엑스--;
std :: cout << x;
}
같은 것을 쓰는 다른 방법입니다.
원본이 "x가 0이되는 동안"처럼 보이는 것이 좋습니다.
|
-와> 사이에 공백이 있습니다. x는 포스트 감소, 즉 조건 x> 0?을 확인한 후 감소합니다.
|
-감소 연산자이고>는보다 큼 연산자입니다.
두 연산자는->와 같이 단일 연산자로 적용됩니다.
|
두 연산자의 조합입니다. 첫 번째-값을 감소시키기위한 것이고>는 값이 오른쪽 피연산자보다 큰지 확인하기위한 것입니다.
#include 
int main ()
{
int x = 10;
동안 (x--> 0)
printf ( "% d", x);
반환 0;
}
출력은 다음과 같습니다.
9876 5 4 3 2 1 0
|
실제로 x는 감소 후이며 해당 조건을 확인하고 있습니다. -> 아님, (x--)> 0
참고 : x의 값은 감소 후이므로 조건을 확인한 후에 변경됩니다. 다음과 같은 유사한 경우도 발생할 수 있습니다.
-> x-> 0
++> x ++> 0
-> = x-> = 0
++> = x ++> = 0
|
C와 C ++는 "maximum munch"규칙을 따릅니다. a --- b가 (a--)-b로 번역되는 것과 같은 방식으로, 귀하의 경우 x-> 0은 (x-)> 0으로 번역됩니다.
규칙이 본질적으로 말하는 것은 왼쪽에서 오른쪽으로 이동하면 유효한 표현을 형성 할 최대 문자를 취하여 표현이 형성된다는 것입니다.
|
왜 모든 합병증입니까?
원래 질문에 대한 간단한 대답은 다음과 같습니다.
#include 
int main ()
{
int x = 10;
동안 (x>0)
{
printf ( "% d", x);
x = x-1;
}
}
같은 일을합니다. 나는 당신이 이렇게해야한다고 말하는 것이 아니라 같은 일을하고 하나의 게시물에서 질문에 대답했을 것입니다.
x--는 위의 약어이고>는 보통보다 큼 연산자입니다. 큰 미스터리가 아닙니다!
요즘은 단순한 일을 복잡하게 만드는 사람이 너무 많아요;)
|
기존 방식으로 while 루프 괄호 ()에 조건을 정의하고 중괄호 {} 안에 종료 조건을 정의하지만->는 두 가지를 동시에 정의합니다.
예를 들면 :
int abc (void)
{
int a = 5
while ((a--)> 0) // 감소와 비교를 동시에
{
// 코드
}
}
이것은 a를 감소시키고 a가 0보다 큰 동안 루프를 실행합니다.
일반적으로 다음과 같습니다.
int abc (void)
{
int a = 5;
동안 (a> 0)
{
ㅏ--;
// 코드
}
ㅏ--;
}
두 가지 방법 모두 동일한 일을하고 동일한 목표를 달성합니다.
|
(x-> 0)은 (x--> 0)을 의미합니다.
(x->)를 사용할 수 있습니다. 출력 : 987654321 0
(-x> 0) 평균 (--x> 0)을 사용할 수 있습니다. 출력 : 9876 5 4 3 2 1
당신이 사용할 수있는
(-\
\
x> 0)
출력 : 9876 5 4 3 2 1
당신이 사용할 수있는
(\
\
x-> 0)
출력 : 9876 5 4 3 2 1 0
당신이 사용할 수있는
(\
\
x-> 0
\
\
)
출력 : 9876 5 4 3 2 1 0
당신은 또한 사용할 수 있습니다
(
엑스
->
)
출력 : 9876 5 4 3 2 1 0
마찬가지로이 명령을 성공적으로 실행하기 위해 많은 방법을 시도 할 수 있습니다.
|
여기-단항 사후 감소 연산자입니다.
while (x--> 0) // x는 0이됩니다.
{
printf ( "% d", x);
}
처음에 조건은 다음과 같이 평가됩니다.
(x> 0) // 10> 0
이제 조건이 참이므로 감소 된 값으로 루프로 이동합니다.
x-- // x = 9
그래서 첫 번째 인쇄 된 값이 9입니다.
등등. 마지막 루프에서 x = 1이므로 조건이 참입니다. 단항 연산자에 따라 인쇄시 값이 x = 0으로 변경되었습니다.
이제 x = 0, 조건 (x> 0)을 false로 평가하고 while 루프가 종료됩니다.
|
이->는 전혀 연산자가 아닙니다. ->와 같은 연산자가 있지만->와는 다릅니다. 이는 단순히 x에 사후 감소 연산자가 있고이 루프가 0보다 클 때까지 실행된다는 것을 의미하는 while (x--> 0)의 잘못된 해석입니다.
이 코드를 작성하는 또 다른 간단한 방법은 while (x--)입니다. while 루프는 거짓 조건이 발생할 때마다 중지되며 여기에는 하나의 경우, 즉 0 만 있습니다. 따라서 x 값이 0으로 감소하면 중지됩니다.
|
매우 적극적인 질문입니다. 이 질문에 답하기 위해 평판 10을 획득하십시오. 평판 요구 사항은 스팸 및 비 응답 활동으로부터이 질문을 보호하는 데 도움이됩니다.
찾고있는 답변이 아닙니까? C ++ C 연산자 코드 형식 표준 준수 태그가 지정된 다른 질문을 찾아 보거나 직접 질문하십시오.